package clases.contabilidad;

import clases.incio.Paginacion;
import CapaDatos.DataSource;
import CapaDatos.Sql;
import global.Dialogos;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class Cuenta {

    private String codigo;
    private String codigoactualizar;
    private String descripcion;
    private String signo;
    private String clase;
    private String idpadre;
    private String sql;
    private final DataSource dt;
    public Paginacion objPaginacion;

    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public String getCodigoactualizar() {
        return codigoactualizar;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;

    }

    public String getSigno() {
        return signo;
    }

    public void setSigno(String signo) {
        this.signo = signo;
    }

    public String getClase() {
        return clase;
    }

    public void setClase(String clase) {
        this.clase = clase;
    }

    public String getIdpadre() {
        return idpadre;
    }

    public void setIdpadre(String idpadre) {
        this.idpadre = idpadre;
    }

    public Cuenta() {
        dt = new DataSource();
        objPaginacion = new Paginacion();

    }

    public boolean guardarCuenta() {
        sql = "INSERT INTO CUENTA VALUES('" + this.codigo + "', " + this.estado() + ", '" + this.descripcion
                + "', 'DETALLE', '" + this.signo + "', '" + this.clase() + "', '"
                + this.idpadre + "', " + Sql.getMax("orden", "cuenta", true) + ")";
        if (Sql.insertar(sql) == true) {
            Dialogos.GuardadoconExito();
            return true;
        } else {
            Dialogos.Error("Error al guardar");
            return false;
        }
    }

    public boolean actualizarCuenta() {
        sql = "UPDATE CUENTA SET CODIGOCUENTA='" + this.codigo + "', DESCRIPCION='" + this.descripcion + "',"
                + " SIGNO='" + this.signo + "', CUENTAPADRE='" + this.idpadre + "' WHERE CODIGOCUENTA='" + this.codigoactualizar + "'";
        if(Sql.actualizar(sql)==true){
        global.Mensajes.mostrarMensaje("Correcto!", "Datos actualizado correctamente...", 1);
            return true;
        } else {
            Dialogos.Error("Error al actualizar los datos");
            return false;
        }
    }

    public void eliminarCuenta(String codigo) {
        sql = "DELETE FROM CUENTA WHERE CODIGOCUENTA='" + codigo + "'";
        Sql.eliminar(sql);
    }

    public void eliminarGrupoCuenta(String desde, String hasta) {
        sql = "DELETE FROM CUENTA WHERE NOT EXISTS (SELECT * FROM DETALLEASIENTO \n"
                + "WHERE CUENTA.CODIGOCUENTA=DETALLEASIENTO.CODIGOCUENTA) \n"
                + "AND CUENTA.CODIGOCUENTA BETWEEN '" + desde + "' AND '" + hasta + "'";
        Sql.eliminar(sql);
    }

    public void eliminarTodasCuenta() {
        sql = "DELETE FROM CUENTA WHERE NOT EXISTS (SELECT * FROM DETALLEASIENTO \n"
                + "WHERE CUENTA.CODIGOCUENTA=DETALLEASIENTO.CODIGOCUENTA)";
        Sql.eliminar(sql);
    }

    public boolean CuentaContabilizada(String cuenta) {
        sql = "SELECT * FROM CUENTA WHERE EXISTS (SELECT * FROM DETALLEASIENTO \n"
                + "WHERE CUENTA.CODIGOCUENTA=DETALLEASIENTO.CODIGOCUENTA) AND CUENTA.CODIGOCUENTA='" + cuenta + "'";
        return Sql.isExiste(sql);
    }

    public void comboEstadoCuenta(JComboBox combo) {
        sql = "SELECT * FROM ESTADOCUENTA";
        Sql.getConsulta(sql, dt);

        combo.addItem("--Seleccione--");
        while (dt.next()) {
            combo.addItem(dt.getString(2));

        }

    }

    public String SqlGeneral() {
        sql = "SELECT CODIGOCUENTA, DESCRIPCION FROM CUENTA "
                + "WHERE TIPO='DETALLE'";
        return sql;
    }

    public String SqlBuscar(String buscar) {
        sql = "SELECT CODIGOCUENTA, DESCRIPCION FROM CUENTA "
                + "WHERE DESCRIPCION LIKE ('" + buscar + "%')";
        return sql;
    }

    public String SqlConsulta(String clase) {
        sql = "SELECT DISTINCT CUENTA.CODIGOCUENTA, CUENTA.DESCRIPCION, \n"
                + "(SELECT CASE WHEN CUENTA.CODIGOCUENTA=DETALLEASIENTO.CODIGOCUENTA\n"
                + "THEN SUM (DETALLEASIENTO.DEBE) ELSE 0.00 END) AS DEBE,\n"
                + "(SELECT CASE WHEN CUENTA.CODIGOCUENTA=DETALLEASIENTO.CODIGOCUENTA\n"
                + "THEN SUM (DETALLEASIENTO.HABER) ELSE 0.00 END) AS HABER,\n"
                + "SUM (DETALLEASIENTO.DEBE)-SUM (DETALLEASIENTO.HABER) AS SALDO\n"
                + "FROM CUENTA LEFT JOIN DETALLEASIENTO ON CUENTA.CODIGOCUENTA=DETALLEASIENTO.CODIGOCUENTA\n"
                + "WHERE CLASE='" + clase + "' AND TIPO='DETALLE'\n"
                + "GROUP BY CUENTA.CODIGOCUENTA, CUENTA.DESCRIPCION, DETALLEASIENTO.CODIGOCUENTA\n"
                + "ORDER BY (CUENTA.CODIGOCUENTA)";
        return sql;
    }

    public String SqlConsultaGeneral() {
        sql = "SELECT DISTINCT CUENTA.CODIGOCUENTA, CUENTA.DESCRIPCION, \n"
                + "(SELECT CASE WHEN CUENTA.CODIGOCUENTA=DETALLEASIENTO.CODIGOCUENTA\n"
                + "THEN SUM (DETALLEASIENTO.DEBE) ELSE 0.00 END) AS DEBE,\n"
                + "(SELECT CASE WHEN CUENTA.CODIGOCUENTA=DETALLEASIENTO.CODIGOCUENTA\n"
                + "THEN SUM (DETALLEASIENTO.HABER) ELSE 0.00 END) AS HABER,\n"
                + "SUM (DETALLEASIENTO.DEBE)-SUM (DETALLEASIENTO.HABER) AS SALDO\n"
                + "FROM CUENTA LEFT JOIN DETALLEASIENTO ON CUENTA.CODIGOCUENTA=DETALLEASIENTO.CODIGOCUENTA\n"
                + "WHERE TIPO='DETALLE'\n"
                + "GROUP BY CUENTA.CODIGOCUENTA, CUENTA.DESCRIPCION, DETALLEASIENTO.CODIGOCUENTA\n"
                + "ORDER BY (CUENTA.CODIGOCUENTA)";
        return sql;
    }

    public String SqlConsultaCodigo(String codigo) {
        sql = "SELECT DISTINCT CUENTA.CODIGOCUENTA, CUENTA.DESCRIPCION, \n"
                + "(SELECT CASE WHEN CUENTA.CODIGOCUENTA=DETALLEASIENTO.CODIGOCUENTA\n"
                + "THEN SUM (DETALLEASIENTO.DEBE) ELSE 0.00 END) AS DEBE,\n"
                + "(SELECT CASE WHEN CUENTA.CODIGOCUENTA=DETALLEASIENTO.CODIGOCUENTA\n"
                + "THEN SUM (DETALLEASIENTO.HABER) ELSE 0.00 END) AS HABER,\n"
                + "SUM (DETALLEASIENTO.DEBE)-SUM (DETALLEASIENTO.HABER) AS SALDO\n"
                + "FROM CUENTA LEFT JOIN DETALLEASIENTO ON CUENTA.CODIGOCUENTA=DETALLEASIENTO.CODIGOCUENTA\n"
                + "WHERE TIPO='DETALLE' AND CUENTA.CODIGOCUENTA LIKE ('" + codigo + "%')\n"
                + "GROUP BY CUENTA.CODIGOCUENTA, CUENTA.DESCRIPCION, DETALLEASIENTO.CODIGOCUENTA\n"
                + "ORDER BY (CUENTA.CODIGOCUENTA)";
        return sql;
    }

    public String SqlConsultaCuenta(String cuenta) {
        sql = "SELECT DISTINCT CUENTA.CODIGOCUENTA, CUENTA.DESCRIPCION, \n"
                + "(SELECT CASE WHEN CUENTA.CODIGOCUENTA=DETALLEASIENTO.CODIGOCUENTA\n"
                + "THEN SUM (DETALLEASIENTO.DEBE) ELSE 0.00 END) AS DEBE,\n"
                + "(SELECT CASE WHEN CUENTA.CODIGOCUENTA=DETALLEASIENTO.CODIGOCUENTA\n"
                + "THEN SUM (DETALLEASIENTO.HABER) ELSE 0.00 END) AS HABER,\n"
                + "SUM (DETALLEASIENTO.DEBE)-SUM (DETALLEASIENTO.HABER) AS SALDO\n"
                + "FROM CUENTA LEFT JOIN DETALLEASIENTO ON CUENTA.CODIGOCUENTA=DETALLEASIENTO.CODIGOCUENTA\n"
                + "WHERE TIPO='DETALLE' AND CUENTA.DESCRIPCION LIKE ('" + cuenta + "%')\n"
                + "GROUP BY CUENTA.CODIGOCUENTA, CUENTA.DESCRIPCION, DETALLEASIENTO.CODIGOCUENTA\n"
                + "ORDER BY (CUENTA.CODIGOCUENTA)";
        return sql;
    }

    public void llenarTabla(DefaultTableModel modelo, JTable tabla, String sql, JLabel Lpaginatotal, JLabel Lpagina, int pagina) {
        modelo = new DefaultTableModel() {
            @Override
            public boolean isCellEditable(int fila, int columna) {
                return false;
            }
        };
        tabla.setModel(modelo);
        modelo.addColumn("CODIGO");
        modelo.addColumn("CUENTA");
        TableColumn columna = new TableColumn();
        columna = tabla.getColumnModel().getColumn(1);
        columna.setPreferredWidth(500);

        sql = objPaginacion.getPaginacion(sql, pagina, 27);
        Sql.getConsulta(sql, dt);

        String[] fila;

        while (dt.next()) {
            fila = new String[2];
            fila[0] = dt.getString(1);
            fila[1] = dt.getString(2);

            modelo.addRow(fila);
            modelo.isCellEditable(1, 1);

        }
        objPaginacion.actualPagina(Lpagina);
        objPaginacion.totalPaginas(Lpaginatotal);
        tabla.getSelectionModel().setSelectionInterval(0, 0);
    }

    public void ConsutaCuenta(DefaultTableModel modelo, JTable tabla, String sql, JLabel Lpaginatotal, JLabel Lpagina, int pagina) {
        modelo = new DefaultTableModel() {
            @Override
            public boolean isCellEditable(int fila, int columna) {
                return false;
            }
        };
        tabla.setModel(modelo);
        modelo.addColumn("CODIGO");
        modelo.addColumn("CUENTA");
        modelo.addColumn("DEBE");
        modelo.addColumn("HABER");
        modelo.addColumn("SALDO");
        DefaultTableCellRenderer centrar = new DefaultTableCellRenderer();
        centrar.setHorizontalAlignment(SwingConstants.RIGHT);
        tabla.getColumnModel().getColumn(2).setCellRenderer(centrar);
        tabla.getColumnModel().getColumn(3).setCellRenderer(centrar);
        tabla.getColumnModel().getColumn(4).setCellRenderer(centrar);
        TableColumn columna = new TableColumn();
        columna = tabla.getColumnModel().getColumn(1);
        columna.setPreferredWidth(400);
        sql = objPaginacion.getPaginacion(sql, pagina, 24);
        Sql.getConsulta(sql, dt);

        String[] fila;

        while (dt.next()) {
            fila = new String[5];
            fila[0] = dt.getString(1);
            fila[1] = dt.getString(2);
            fila[2] = dt.getString(3);
            fila[3] = dt.getString(4);
            fila[4] = dt.getString(5);

            modelo.addRow(fila);
        }
        objPaginacion.actualPagina(Lpagina);
        objPaginacion.totalPaginas(Lpaginatotal);
        tabla.getSelectionModel().setSelectionInterval(0, 0);
    }

    public String generarCodigo(String cuenta) {
        int n = 0;
        this.sacarCodigo(cuenta);
        Sql.getConsulta("SELECT COUNT(CODIGOCUENTA) FROM CUENTA WHERE CUENTAPADRE='" + this.codigo + "'", dt);
        while (dt.next()) {
            n = dt.getInt(1) + 01;
        }
        if (n < 10) {
            String add;
            add = "0" + n;
            return codigo + add;
        } else {
            return codigo + n;
        }
    }

    public boolean ExistenciaCuenta(String codigo) {
        sql = "SELECT * FROM CUENTA WHERE CODIGOCUENTA='" + codigo + "' AND CODIGOCUENTA!='" + this.codigoactualizar + "'";
        return Sql.isExiste(sql);
    }

    
    public int estado() {
        sql = "SELECT IDESTADO FROM CUENTA WHERE CODIGOCUENTA='" + idpadre + "'";
        Sql.getConsulta(sql, dt);
        int estado = 1;
        while (dt.next()) {
            estado = dt.getInt(1);
        }
        return estado;
    }

    public String clase() {
        sql = "SELECT CLASE FROM CUENTA WHERE CODIGOCUENTA='" + idpadre + "'";
        Sql.getConsulta(sql, dt);
        String clase = "";
        while (dt.next()) {
            clase = dt.getString(1);
        }
        return clase;
    }

    public void llenardatos(String codigo) {
        sql = "SELECT CODIGOCUENTA, DESCRIPCION, SIGNO, (\n"
                + "SELECT DESCRIPCION FROM CUENTA WHERE CODIGOCUENTA \n"
                + "IN (SELECT CUENTAPADRE FROM CUENTA WHERE CODIGOCUENTA='" + codigo + "')\n"
                + ") AS PADRE\n FROM CUENTA WHERE CODIGOCUENTA ='" + codigo + "'";
        System.out.println(sql);
        Sql.getConsulta(sql, dt);
        while (dt.next()) {
            this.codigo = dt.getString(1);
            this.codigoactualizar = this.codigo;
            this.descripcion = dt.getString(2);
            this.signo = dt.getString(3);
            this.idpadre = dt.getString(4);
        }
    }
    

    public void sacarPadreCuenta(String cuenta) {
        sql = "SELECT CODIGOCUENTA FROM CUENTA WHERE DESCRIPCION='" + cuenta + "'";
        Sql.getConsulta(sql, dt);
        while (dt.next()) {
            idpadre = dt.getString(1);
        }
    }

    public void getCuenta(String codigo) {
        sql = "SELECT DESCRIPCION FROM CUENTA WHERE CODIGOCUENTA='" + codigo + "'";
        Sql.getConsulta(sql, dt);
        while (dt.next()) {
            this.descripcion = dt.getString(1);
        }
    }

    public void sacarCodigo(String cuenta) {
        sql = "SELECT CODIGOCUENTA FROM CUENTA WHERE DESCRIPCION='" + cuenta + "'";
        Sql.getConsulta(sql, dt);
        while (dt.next()) {
            this.codigo = dt.getString(1);
        }
    }

}
